package x.x.x;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;

public class GetFileMd5 {
    
    /**
     * 根据传入的File对象生成一个此文件对象的MD5值
     * 注意:不适合用于大文件,大文件定义是大于2G.原因:效率底下
     * 
     * 备注1:Apache有Md5生成的jar包,可以看看去
     *@author hanxy17
     * 如修改方法体请自行修改作者信息
     * 当前作者只对自己编写内容负责
     * 2017年3月9日下午6:37:35
     * @param file
     * @return
     * @throws FileNotFoundException
     */
    public static String getMd5ByFile(File file) throws FileNotFoundException{
        String result = null;
        FileInputStream fis = new FileInputStream(file);
        try {
            MappedByteBuffer byteBuffer = fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(byteBuffer);
            BigInteger bi = new BigInteger(1,md5.digest());
            result = bi.toString(16);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        return result;
    }
    
    
    public static void main(String[] args){
        String path = "WebRoot/WEB-INF/conf.xml";
        File file = new File(path);
        System.err.println(file.getAbsolutePath());
        String md5 = null;
        try {
            md5 = GetFileMd5.getMd5ByFile(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.err.println("MD5:");
        System.err.println((md5 != null ?md5.toUpperCase() : "null"));
    }
}
